<div class="selenium-notes">
<h1>Framework Architecture in Selenium</h1>
<p><strong>Framework Architecture</strong> in Selenium defines the overall structure, organization, and interaction of different components used to build a maintainable, reusable, scalable, and reliable automation testing framework. Instead of writing all Selenium code directly inside individual test cases, a framework separates responsibilities such as test execution, page objects, WebDriver management, test data, configuration, utilities, reporting, logging, screenshots, and CI/CD.</p>
<p>A well-designed Selenium framework helps automation engineers reduce code duplication, improve maintainability, simplify debugging, support multiple browsers, execute tests in parallel, manage test data, generate reports, and integrate automated tests into CI/CD pipelines.</p>
<p>JustAcademy's Selenium training curriculum includes Selenium WebDriver, TestNG, Data-Driven Testing, Page Object Model, Automation Framework concepts, Keyword-Driven Framework, Hybrid Framework Design, Reusable Test Architecture, Reporting, Logging, Debugging, Selenium Grid, Cross-Browser Testing, and CI/CD. These topics are important building blocks for understanding real-world Selenium framework architecture.</p>
<p><a href="https://www.justacademy.co/course-detail/selenium-training" target="_blank" rel="noopener noreferrer">Selenium Training</a> | <a href="https://www.justacademy.co/register-for-course-demo" target="_blank" rel="noopener noreferrer">Register for Course Demo</a></p>
<hr>
<h2>1. What Is Framework Architecture?</h2>
<p>Framework Architecture is the structural design of an automation project that defines how different components communicate and work together.</p>
<p>In a Selenium automation framework, these components may include:</p>
<ul>
<li>Test classes</li>
<li>TestNG</li>
<li>Page Object Model</li>
<li>Page Factory</li>
<li>WebDriver</li>
<li>Driver Factory</li>
<li>Base Test</li>
<li>Base Page</li>
<li>Configuration files</li>
<li>Test data</li>
<li>Utility classes</li>
<li>Wait mechanisms</li>
<li>Listeners</li>
<li>Logging</li>
<li>Reporting</li>
<li>Screenshots</li>
<li>Selenium Grid</li>
<li>Maven</li>
<li>Git</li>
<li>Jenkins and CI/CD</li>
</ul>
<hr>
<h2>2. Simple Definition</h2>
<p><strong>Selenium Framework Architecture is an organized structure that separates automation responsibilities into reusable components so that Selenium tests can be developed, executed, maintained, and scaled efficiently.</strong></p>
<hr>
<h2>3. Why Do We Need Framework Architecture?</h2>
<p>Suppose an automation team has only one test case. A simple Selenium script may be enough:</p>
<pre><code>WebDriver driver = new ChromeDriver();
driver.get("https://example.com");
driver.findElement(By.id("username")).sendKeys("admin");
driver.findElement(By.id("password")).sendKeys("admin123");
driver.findElement(By.id("login")).click();</code></pre>
<p>This approach becomes difficult when the project contains hundreds of test cases.</p>
<p>Without a proper architecture:</p>
<ul>
<li>Browser setup gets duplicated.</li>
<li>Locators are repeated in multiple test cases.</li>
<li>Test data becomes difficult to manage.</li>
<li>Changing a locator requires multiple modifications.</li>
<li>Reports become difficult to maintain.</li>
<li>Debugging becomes harder.</li>
<li>Parallel execution becomes complicated.</li>
<li>Cross-browser testing becomes difficult.</li>
<li>CI/CD integration becomes difficult.</li>
<li>Multiple testers cannot easily maintain the project.</li>
</ul>
<hr>
<h2>4. Main Objectives of Framework Architecture</h2>
<ul>
<li>Maintainability</li>
<li>Reusability</li>
<li>Scalability</li>
<li>Readability</li>
<li>Reliability</li>
<li>Test execution management</li>
<li>Centralized configuration</li>
<li>Centralized driver management</li>
<li>Test-data management</li>
<li>Reporting</li>
<li>Logging</li>
<li>Error handling</li>
<li>Screenshot capture</li>
<li>Parallel execution</li>
<li>Cross-browser testing</li>
<li>CI/CD integration</li>
</ul>
<hr>
<h2>5. Basic Selenium Framework Architecture</h2>
<pre><code> Selenium Automation Framework
|
+----------------------+----------------------+
| | |
Test Layer Page Layer Data Layer
| | |
TestNG Page Objects Excel / CSV
| | JSON / DB
+----------------------+----------------------+
|
Utility Layer
|
+--------------------+--------------------+
| | |
Waits Screenshots Files
| | |
+--------------------+--------------------+
|
Driver Management
|
WebDriver
|
Browser
|
Web Application</code></pre>
<hr>
<h2>6. High-Level Framework Flow</h2>
<pre><code>TestNG / Test Runner
↓
Test Class
↓
Page Object
↓
Page Methods
↓
Selenium WebDriver
↓
Browser
↓
Web Application
↓
Assertions
↓
Test Result
↓
Report / Log / Screenshot</code></pre>
<hr>
<h2>7. Main Layers of Selenium Framework</h2>
<table border="1" cellpadding="8" cellspacing="0">
<tr><th>Layer</th><th>Purpose</th></tr>
<tr><td>Test Layer</td><td>Contains test scenarios and validations.</td></tr>
<tr><td>Page Layer</td><td>Contains page locators and page actions.</td></tr>
<tr><td>Base Layer</td><td>Contains common test/page functionality.</td></tr>
<tr><td>Driver Layer</td><td>Creates and manages WebDriver instances.</td></tr>
<tr><td>Data Layer</td><td>Manages external and internal test data.</td></tr>
<tr><td>Configuration Layer</td><td>Stores browser, URL, timeout, and environment settings.</td></tr>
<tr><td>Utility Layer</td><td>Provides reusable helper methods.</td></tr>
<tr><td>Listener Layer</td><td>Handles test execution events.</td></tr>
<tr><td>Reporting Layer</td><td>Generates test execution reports.</td></tr>
<tr><td>Logging Layer</td><td>Records execution details and errors.</td></tr>
<tr><td>CI/CD Layer</td><td>Automates build and test execution.</td></tr>
</table>
<hr>
<h2>8. Separation of Concerns</h2>
<p>One of the most important principles of framework architecture is <strong>Separation of Concerns</strong>.</p>
<p>Each component should have a specific responsibility.</p>
<pre><code>Test Class
→ What should be tested?
Page Object
→ How should the page be operated?
Driver Factory
→ Which browser should be started?
Config Reader
→ Which configuration should be loaded?
Data Utility
→ Where should test data come from?
Wait Utility
→ How should synchronization be handled?
Report Manager
→ How should test results be displayed?
Screenshot Utility
→ How should screenshots be captured?</code></pre>
<hr>
<h2>9. Recommended Selenium Framework Project Structure</h2>
<pre><code>SeleniumAutomationFramework
│
├── pom.xml
│
├── src
│ ├── main
│ │ └── java
│ │ ├── base
│ │ │ ├── BasePage.java
│ │ │ └── BaseTest.java
│ │ │
│ │ ├── pages
│ │ │ ├── LoginPage.java
│ │ │ ├── HomePage.java
│ │ │ ├── ProductPage.java
│ │ │ ├── CartPage.java
│ │ │ └── CheckoutPage.java
│ │ │
│ │ ├── factory
│ │ │ └── DriverFactory.java
│ │ │
│ │ ├── utilities
│ │ │ ├── WaitUtil.java
│ │ │ ├── ExcelUtil.java
│ │ │ ├── ScreenshotUtil.java
│ │ │ ├── ConfigReader.java
│ │ │ └── JavaScriptUtil.java
│ │ │
│ │ ├── listeners
│ │ │ └── TestListener.java
│ │ │
│ │ └── reports
│ │ └── ReportManager.java
│ │
│ └── test
│ ├── java
│ │ └── tests
│ │ ├── LoginTest.java
│ │ ├── ProductTest.java
│ │ ├── CartTest.java
│ │ └── CheckoutTest.java
│ │
│ └── resources
│ ├── config.properties
│ ├── testdata.xlsx
│ └── testng.xml
│
├── screenshots
├── reports
└── logs</code></pre>
<hr>
<h2>10. Test Layer</h2>
<p>The Test Layer contains actual test scenarios. It should focus on describing what needs to be tested rather than containing every low-level Selenium command.</p>
<p>Typical test classes include:</p>
<ul>
<li>LoginTest</li>
<li>RegistrationTest</li>
<li>SearchTest</li>
<li>ProductTest</li>
<li>CartTest</li>
<li>CheckoutTest</li>
<li>ProfileTest</li>
<li>OrderTest</li>
</ul>
<hr>
<h2>11. Example Test Class</h2>
<pre><code>public class LoginTest extends BaseTest {
@Test
public void validLoginTest() {
LoginPage loginPage =
new LoginPage(driver);
loginPage.login(
"admin",
"admin123"
);
Assert.assertTrue(
loginPage.isLoginSuccessful()
);
}
}</code></pre>
<hr>
<h2>12. Page Object Layer</h2>
<p>The Page Object layer represents application pages or reusable UI components as classes.</p>
<p>Examples:</p>
<pre><code>LoginPage
HomePage
ProductPage
CartPage
CheckoutPage
OrderConfirmationPage</code></pre>
<p>A Page Object normally contains:</p>
<ul>
<li>Locators</li>
<li>Page-specific actions</li>
<li>Validation methods</li>
<li>Navigation methods</li>
<li>Reusable page behavior</li>
</ul>
<hr>
<h2>13. Page Object Example</h2>
<pre><code>public class LoginPage {
private WebDriver driver;
private By username =
By.id("username");
private By password =
By.id("password");
private By loginButton =
By.id("login");
public LoginPage(WebDriver driver) {
this.driver = driver;
}
public void enterUsername(String value) {
driver.findElement(username)
.sendKeys(value);
}
public void enterPassword(String value) {
driver.findElement(password)
.sendKeys(value);
}
public void clickLogin() {
driver.findElement(loginButton)
.click();
}
public void login(
String user,
String pass) {
enterUsername(user);
enterPassword(pass);
clickLogin();
}
}</code></pre>
<hr>
<h2>14. Page Factory in Framework Architecture</h2>
<p><strong>Page Factory</strong> can be used as an implementation approach within the Page Object layer. It is important to understand that Page Factory is not the complete framework architecture. POM is the design pattern, while Page Factory is one traditional approach for representing and initializing page elements.</p>
<pre><code>Test Class
↓
LoginPage
↓
@FindBy
↓
PageFactory.initElements()
↓
WebElement
↓
WebDriver
↓
Browser</code></pre>
<hr>
<h2>15. BaseTest Layer</h2>
<p><code>BaseTest</code> contains common test lifecycle operations shared by multiple test classes.</p>
<p>Typical responsibilities include:</p>
<ul>
<li>Browser initialization</li>
<li>Application launch</li>
<li>Browser configuration</li>
<li>Test setup</li>
<li>Test cleanup</li>
<li>Driver shutdown</li>
</ul>
<hr>
<h2>16. BaseTest Example</h2>
<pre><code>public class BaseTest {
protected WebDriver driver;
@BeforeMethod
public void setUp() {
driver = new ChromeDriver();
driver.manage()
.window()
.maximize();
driver.get(
"https://example.com"
);
}
@AfterMethod
public void tearDown() {
if (driver != null) {
driver.quit();
}
}
}</code></pre>
<hr>
<h2>17. Driver Factory</h2>
<p>A <strong>Driver Factory</strong> centralizes WebDriver creation.</p>
<p>Instead of creating browsers directly in every test class, the framework can use one common component.</p>
<pre><code>Test
↓
DriverFactory
↓
Browser Selection
↓
Chrome / Firefox / Edge
↓
WebDriver Instance</code></pre>
<hr>
<h2>18. Driver Factory Example</h2>
<pre><code>public class DriverFactory {
public static WebDriver createDriver(
String browser) {
if (browser.equalsIgnoreCase("chrome")) {
return new ChromeDriver();
}
if (browser.equalsIgnoreCase("firefox")) {
return new FirefoxDriver();
}
if (browser.equalsIgnoreCase("edge")) {
return new EdgeDriver();
}
throw new IllegalArgumentException(
"Unsupported browser: " + browser
);
}
}</code></pre>
<hr>
<h2>19. Driver Management Flow</h2>
<pre><code>Configuration
↓
Browser = chrome
↓
DriverFactory
↓
ChromeDriver
↓
WebDriver
↓
Test Execution</code></pre>
<hr>
<h2>20. Configuration Layer</h2>
<p>Configuration values should be centralized instead of being repeated throughout the project.</p>
<p>Typical configuration values include:</p>
<ul>
<li>Browser</li>
<li>Application URL</li>
<li>Environment</li>
<li>Timeout</li>
<li>Headless mode</li>
<li>Remote execution URL</li>
<li>Screenshot settings</li>
</ul>
<hr>
<h2>21. config.properties Example</h2>
<pre><code>browser=chrome
url=https://example.com
timeout=10
environment=qa
headless=false</code></pre>
<hr>
<h2>22. Configuration Reader</h2>
<pre><code>public class ConfigReader {
private static Properties properties;
static {
properties = new Properties();
try (FileInputStream file =
new FileInputStream(
"src/test/resources/config.properties")) {
properties.load(file);
} catch (IOException e) {
throw new RuntimeException(
"Unable to load configuration",
e
);
}
}
public static String get(String key) {
return properties.getProperty(key);
}
}</code></pre>
<hr>
<h2>23. Test Data Layer</h2>
<p>The Test Data Layer manages the input data required by test cases.</p>
<p>Test data can be stored in:</p>
<ul>
<li>Java objects</li>
<li>TestNG DataProvider</li>
<li>Excel</li>
<li>CSV</li>
<li>JSON</li>
<li>Database</li>
<li>Properties files</li>
<li>API responses</li>
</ul>
<hr>
<h2>24. Data-Driven Architecture</h2>
<pre><code>Excel / CSV / JSON
↓
Data Utility
↓
DataProvider
↓
Test Class
↓
Page Object
↓
Web Application</code></pre>
<hr>
<h2>25. TestNG DataProvider Example</h2>
<pre><code>@DataProvider(name = "loginData")
public Object[][] loginData() {
return new Object[][] {
{"admin", "admin123"},
{"user1", "password1"},
{"user2", "password2"}
};
}
@Test(dataProvider = "loginData")
public void loginTest(
String username,
String password) {
LoginPage loginPage =
new LoginPage(driver);
loginPage.login(
username,
password
);
}</code></pre>
<hr>
<h2>26. Utility Layer</h2>
<p>Utility classes contain reusable operations that can be used by multiple tests and pages.</p>
<p>Common utilities include:</p>
<ul>
<li>WaitUtil</li>
<li>ExcelUtil</li>
<li>ScreenshotUtil</li>
<li>ConfigReader</li>
<li>DateUtil</li>
<li>FileUtil</li>
<li>JavaScriptUtil</li>
<li>BrowserUtil</li>
</ul>
<hr>
<h2>27. Wait Utility</h2>
<p>Synchronization is an important part of a Selenium framework because modern web applications often load elements dynamically.</p>
<pre><code>public class WaitUtil {
private WebDriverWait wait;
public WaitUtil(WebDriver driver) {
wait = new WebDriverWait(
driver,
Duration.ofSeconds(10)
);
}
public void waitForVisible(
WebElement element) {
wait.until(
ExpectedConditions.visibilityOf(element)
);
}
public void waitForClickable(
WebElement element) {
wait.until(
ExpectedConditions.elementToBeClickable(element)
);
}
}</code></pre>
<hr>
<h2>28. Why Avoid Excessive Thread.sleep()?</h2>
<p><code>Thread.sleep()</code> pauses execution for a fixed amount of time regardless of whether the element is already ready.</p>
<p>Explicit waits are generally more suitable for condition-based synchronization.</p>
<pre><code>Thread.sleep(5000);
vs.
wait.until(
ExpectedConditions.elementToBeClickable(button)
);</code></pre>
<hr>
<h2>29. Screenshot Utility</h2>
<pre><code>public class ScreenshotUtil {
public static void capture(
WebDriver driver,
String fileName) {
File source =
((TakesScreenshot) driver)
.getScreenshotAs(OutputType.FILE);
File destination =
new File(
"screenshots/"
+ fileName
+ ".png"
);
try {
Files.copy(
source.toPath(),
destination.toPath()
);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}</code></pre>
<hr>
<h2>30. Reporting Layer</h2>
<p>The Reporting Layer records test execution results and provides a readable representation of automation results.</p>
<p>A report can contain:</p>
<ul>
<li>Test name</li>
<li>Test status</li>
<li>Execution time</li>
<li>Failure reason</li>
<li>Screenshot</li>
<li>Browser information</li>
<li>Environment information</li>
<li>Logs</li>
</ul>
<p>Common reporting solutions used with Java automation include TestNG reports, ExtentReports, and Allure.</p>
<hr>
<h2>31. Reporting Flow</h2>
<pre><code>Test Starts
↓
Test Executes
↓
PASS / FAIL / SKIP
↓
Listener
↓
Report Manager
↓
HTML / Dashboard Report</code></pre>
<hr>
<h2>32. Logging Layer</h2>
<p>Logging provides information about what happened during test execution.</p>
<pre><code>INFO - Browser started
INFO - Application opened
INFO - Login page loaded
INFO - Username entered
INFO - Password entered
INFO - Login button clicked
INFO - Dashboard verified
INFO - Test completed</code></pre>
<p>Log4j is one commonly used logging solution in Java automation projects.</p>
<hr>
<h2>33. Listener Layer</h2>
<p>TestNG listeners can react to test lifecycle events.</p>
<p>Common events include:</p>
<ul>
<li>Test started</li>
<li>Test passed</li>
<li>Test failed</li>
<li>Test skipped</li>
<li>Suite started</li>
<li>Suite finished</li>
</ul>
<hr>
<h2>34. Listener Architecture</h2>
<pre><code>TestNG
|
+-- onStart()
|
+-- onTestStart()
|
+-- onTestSuccess()
|
+-- onTestFailure()
|
+-- onTestSkipped()
|
+-- onFinish()</code></pre>
<hr>
<h2>35. Failure Handling Architecture</h2>
<pre><code>Test Failure
↓
Listener
↓
Capture Screenshot
↓
Write Log
↓
Update Report
↓
Mark Test Failed</code></pre>
<hr>
<h2>36. Maven Layer</h2>
<p>Maven is commonly used to manage dependencies, build the project, and execute tests.</p>
<p>A Selenium project may include dependencies such as:</p>
<ul>
<li>Selenium Java</li>
<li>TestNG</li>
<li>Apache POI</li>
<li>Logging libraries</li>
<li>Reporting libraries</li>
</ul>
<hr>
<h2>37. Maven Project Configuration</h2>
<pre><code><project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>selenium-framework</artifactId>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>YOUR_VERSION</version>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>YOUR_VERSION</version>
<scope>test</scope>
</dependency>
</dependencies>
</project></code></pre>
<hr>
<h2>38. TestNG Layer</h2>
<p>TestNG provides test execution and test-management features.</p>
<p>Important features include:</p>
<ul>
<li><code>@Test</code></li>
<li><code>@BeforeMethod</code></li>
<li><code>@AfterMethod</code></li>
<li><code>@BeforeClass</code></li>
<li><code>@AfterClass</code></li>
<li>Assertions</li>
<li>DataProvider</li>
<li>Groups</li>
<li>Dependencies</li>
<li>Listeners</li>
<li>Parallel execution</li>
</ul>
<hr>
<h2>39. TestNG Execution Flow</h2>
<pre><code>testng.xml
↓
Test Suite
↓
Test Class
↓
@BeforeMethod
↓
@Test
↓
Assertions
↓
@AfterMethod
↓
Listener
↓
Report</code></pre>
<hr>
<h2>40. testng.xml Example</h2>
<pre><code><?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM
"https://testng.org/testng-1.0.dtd">
<suite name="AutomationSuite">
<test name="LoginTests">
<classes>
<class name="tests.LoginTest"/>
</classes>
</test>
</suite></code></pre>
<hr>
<h2>41. Test Groups</h2>
<p>TestNG groups can organize tests according to their purpose.</p>
<pre><code>Smoke
Regression
Sanity
Functional
Critical
EndToEnd</code></pre>
<p>Example:</p>
<pre><code>@Test(groups = {"smoke"})
public void loginTest() {
// test logic
}</code></pre>
<hr>
<h2>42. Smoke Test Architecture</h2>
<pre><code>New Build
↓
Smoke Suite
↓
Login
Search
Navigation
Critical Features
↓
PASS
↓
Continue Testing</code></pre>
<hr>
<h2>43. Regression Framework Architecture</h2>
<pre><code>Application Changes
↓
Regression Suite
↓
Test Classes
↓
Page Objects
↓
WebDriver
↓
Browser
↓
Assertions
↓
Reports</code></pre>
<hr>
<h2>44. Keyword-Driven Framework</h2>
<p>A Keyword-Driven Framework represents actions through keywords.</p>
<table border="1" cellpadding="8" cellspacing="0">
<tr><th>Keyword</th><th>Action</th></tr>
<tr><td>OPEN_URL</td><td>Open application URL.</td></tr>
<tr><td>ENTER_TEXT</td><td>Enter text.</td></tr>
<tr><td>CLICK</td><td>Click an element.</td></tr>
<tr><td>SELECT</td><td>Select an option.</td></tr>
<tr><td>VERIFY_TEXT</td><td>Verify text.</td></tr>
<tr><td>SCREENSHOT</td><td>Capture screenshot.</td></tr>
</table>
<hr>
<h2>45. Keyword-Driven Architecture</h2>
<pre><code>Test Data
↓
Keywords
↓
Keyword Engine
↓
Utility / Page Methods
↓
Selenium WebDriver
↓
Browser</code></pre>
<hr>
<h2>46. Hybrid Framework</h2>
<p>A Hybrid Framework combines multiple automation approaches and supporting components.</p>
<pre><code> Hybrid Framework
|
+-------------------+-------------------+
| | |
POM Data-Driven Keyword-Driven
| | |
+-------------------+-------------------+
|
TestNG
|
Utilities
|
Reporting / Logging
|
CI/CD / Grid</code></pre>
<hr>
<h2>47. Page Object Model and Framework Architecture</h2>
<p>Page Object Model separates page-specific UI implementation from test scenarios.</p>
<pre><code>Test Class
↓
Page Object
↓
Locators + Actions
↓
WebDriver
↓
Browser
↓
Application</code></pre>
<p>This separation helps reduce duplication and makes page-related changes easier to manage.</p>
<hr>
<h2>48. BasePage</h2>
<p>A <code>BasePage</code> can provide common operations to different page classes.</p>
<pre><code>public class BasePage {
protected WebDriver driver;
protected WebDriverWait wait;
public BasePage(WebDriver driver) {
this.driver = driver;
this.wait =
new WebDriverWait(
driver,
Duration.ofSeconds(10)
);
}
protected void click(WebElement element) {
wait.until(
ExpectedConditions.elementToBeClickable(element)
).click();
}
protected void type(
WebElement element,
String text) {
wait.until(
ExpectedConditions.visibilityOf(element)
);
element.clear();
element.sendKeys(text);
}
}</code></pre>
<hr>
<h2>49. Page Factory-Based Page Object</h2>
<pre><code>public class LoginPage extends BasePage {
@FindBy(id = "username")
private WebElement username;
@FindBy(id = "password")
private WebElement password;
@FindBy(id = "login")
private WebElement loginButton;
public LoginPage(WebDriver driver) {
super(driver);
PageFactory.initElements(
driver,
this
);
}
public void login(
String user,
String pass) {
type(username, user);
type(password, pass);
click(loginButton);
}
}</code></pre>
<hr>
<h2>50. Thread-Safe Driver Architecture</h2>
<p>Parallel execution requires proper driver isolation. Multiple tests should not unintentionally share the same WebDriver instance.</p>
<pre><code>Thread 1 → Driver 1 → Chrome
Thread 2 → Driver 2 → Firefox
Thread 3 → Driver 3 → Edge</code></pre>
<p><code>ThreadLocal</code> is one technique that can be used for maintaining a driver per execution thread.</p>
<hr>
<h2>51. ThreadLocal Driver Example</h2>
<pre><code>public class DriverManager {
private static ThreadLocal<WebDriver> driver =
new ThreadLocal<>();
public static void setDriver(
WebDriver webDriver) {
driver.set(webDriver);
}
public static WebDriver getDriver() {
return driver.get();
}
public static void unload() {
driver.remove();
}
}</code></pre>
<hr>
<h2>52. Parallel Execution Architecture</h2>
<pre><code> Test Suite
|
+-----------+-----------+
| | |
Thread 1 Thread 2 Thread 3
| | |
Driver 1 Driver 2 Driver 3
| | |
Chrome Firefox Edge
| | |
+-----------+-----------+
|
Results</code></pre>
<hr>
<h2>53. Selenium Grid Architecture</h2>
<p>Selenium Grid can be used for remote execution and running tests across different browser environments.</p>
<pre><code>Test Machine
|
↓
Selenium Grid
|
+---+---+---+
| | |
Chrome Firefox Edge
| | |
Node 1 Node 2 Node 3</code></pre>
<hr>
<h2>54. Cross-Browser Architecture</h2>
<pre><code> Test Suite
|
Driver Factory
|
+-------------+-------------+
| | |
Chrome Firefox Edge
| | |
+-------------+-------------+
|
Results</code></pre>
<hr>
<h2>55. Environment-Based Architecture</h2>
<p>Real-world projects may have multiple environments such as Development, QA, UAT, and Production-like test environments.</p>
<pre><code>Environment
|
+-- DEV
|
+-- QA
|
+-- UAT
|
+-- STAGING</code></pre>
<p>The framework can select the target environment using configuration.</p>
<hr>
<h2>56. Environment Configuration</h2>
<pre><code>environment=qa
qa.url=https://qa.example.com
uat.url=https://uat.example.com
staging.url=https://staging.example.com</code></pre>
<hr>
<h2>57. Component-Based Architecture</h2>
<p>Large web applications often contain reusable components such as headers, menus, search boxes, product cards, and footers.</p>
<pre><code>HomePage
|
+-- HeaderComponent
|
+-- NavigationComponent
|
+-- SearchComponent
|
+-- ProductComponent
|
+-- FooterComponent</code></pre>
<p>Reusable component objects can prevent duplication when the same UI appears across multiple pages.</p>
<hr>
<h2>58. Page Navigation Architecture</h2>
<pre><code>LoginPage
↓ login()
HomePage
↓ openProducts()
ProductPage
↓ addToCart()
CartPage
↓ checkout()
CheckoutPage
↓ placeOrder()
OrderConfirmationPage</code></pre>
<hr>
<h2>59. Fluent Page Object Architecture</h2>
<p>A fluent page object can return itself or another page object to create readable workflows.</p>
<pre><code>loginPage
.enterUsername("admin")
.enterPassword("admin123")
.clickLogin();</code></pre>
<hr>
<h2>60. Test Data Management Architecture</h2>
<pre><code>Excel / CSV / JSON / Database
↓
Data Utility
↓
Data Provider
↓
Test Class
↓
Page Object
↓
Application</code></pre>
<hr>
<h2>61. Excel-Based Data Architecture</h2>
<p>Apache POI is commonly used in Java projects when test data is stored in Excel files.</p>
<pre><code>testdata.xlsx
↓
ExcelUtil
↓
DataProvider
↓
LoginTest
↓
LoginPage</code></pre>
<hr>
<h2>62. Screenshot Architecture</h2>
<pre><code>Test Failure
↓
TestNG Listener
↓
Screenshot Utility
↓
Capture Browser
↓
Save Screenshot
↓
Attach to Report</code></pre>
<hr>
<h2>63. Error Handling Architecture</h2>
<p>A framework should handle failures in a controlled manner and provide enough information for debugging.</p>
<p>Common failure types include:</p>
<ul>
<li>NoSuchElementException</li>
<li>TimeoutException</li>
<li>StaleElementReferenceException</li>
<li>ElementClickInterceptedException</li>
<li>WebDriverException</li>
<li>Configuration errors</li>
<li>Test-data errors</li>
<li>Environment failures</li>
</ul>
<hr>
<h2>64. Retry Mechanism</h2>
<p>A controlled retry mechanism may be used for certain temporary infrastructure or execution failures. It should not be used to hide genuine application defects or consistently unstable tests.</p>
<pre><code>Test
↓
Failure
↓
Retry Policy
↓
Retry
↓
Pass / Fail
↓
Final Report</code></pre>
<hr>
<h2>65. CI/CD Architecture</h2>
<p>Selenium automation can be integrated with CI/CD pipelines so tests can execute automatically after code changes or according to a scheduled pipeline.</p>
<pre><code>Developer
↓
Git Commit
↓
Git Repository
↓
Jenkins / CI Server
↓
Maven Build
↓
TestNG
↓
Selenium
↓
Browser / Grid
↓
Reports
↓
Build Result</code></pre>
<hr>
<h2>66. Git Integration</h2>
<p>Git can be used to maintain framework source code and collaborate with other automation engineers.</p>
<p>Common Git activities include:</p>
<ul>
<li>Clone</li>
<li>Branch</li>
<li>Commit</li>
<li>Push</li>
<li>Pull</li>
<li>Merge</li>
<li>Pull Request</li>
</ul>
<hr>
<h2>67. Jenkins Integration</h2>
<p>A Jenkins pipeline can retrieve the framework from source control and execute Maven tests.</p>
<pre><code>Git Checkout
↓
Maven Clean
↓
Maven Test
↓
TestNG
↓
Selenium
↓
Reports
↓
Publish Results</code></pre>
<hr>
<h2>68. Maven Test Execution</h2>
<pre><code>mvn clean test</code></pre>
<p>The command can be executed locally or from a CI/CD pipeline depending on the project configuration.</p>
<hr>
<h2>69. CI/CD Parameters</h2>
<p>Execution settings can be supplied externally instead of hard-coding them.</p>
<pre><code>BROWSER=chrome
ENVIRONMENT=qa
HEADLESS=true</code></pre>
<p>The framework can read these values and configure the test run accordingly.</p>
<hr>
<h2>70. Logging and Debugging Architecture</h2>
<pre><code>Test
↓
Action
↓
Log Information
↓
Failure?
↓
Yes → Log Error
↓
Capture Screenshot
↓
Attach Report
↓
Debug</code></pre>
<hr>
<h2>71. Reporting and Logging Relationship</h2>
<table border="1" cellpadding="8" cellspacing="0">
<tr><th>Logging</th><th>Reporting</th></tr>
<tr><td>Records execution information.</td><td>Displays test results.</td></tr>
<tr><td>Useful for debugging.</td><td>Useful for result analysis.</td></tr>
<tr><td>Can contain technical details.</td><td>Usually provides summarized execution status.</td></tr>
<tr><td>Tracks actions and errors.</td><td>Tracks PASS/FAIL/SKIP and evidence.</td></tr>
</table>
<hr>
<h2>72. Framework Design Principles</h2>
<h3>Single Responsibility</h3>
<p>Each class should have a clear and focused responsibility.</p>
<h3>DRY</h3>
<p><strong>Don't Repeat Yourself</strong> means common implementation should be reused rather than copied.</p>
<h3>Encapsulation</h3>
<p>Implementation details should remain inside appropriate classes.</p>
<h3>Abstraction</h3>
<p>Tests should interact with meaningful business-level methods where practical.</p>
<h3>Reusability</h3>
<p>Common operations should be available to multiple tests.</p>
<h3>Maintainability</h3>
<p>The framework should be easy to modify when application requirements change.</p>
<h3>Scalability</h3>
<p>The architecture should support increasing numbers of tests, browsers, environments, and users.</p>
<hr>
<h2>73. DRY Principle Example</h2>
<p>Bad architecture:</p>
<pre><code>LoginTest
→ browser setup
ProductTest
→ browser setup
CheckoutTest
→ browser setup
ProfileTest
→ browser setup</code></pre>
<p>Better architecture:</p>
<pre><code>BaseTest / DriverFactory
↓
Reusable Browser Setup
↓
All Test Classes</code></pre>
<hr>
<h2>74. Encapsulation Example</h2>
<p>Instead of exposing page elements directly:</p>
<pre><code>loginPage.username.sendKeys("admin");</code></pre>
<p>use a page method:</p>
<pre><code>loginPage.enterUsername("admin");</code></pre>
<p>This keeps page implementation details inside the page class.</p>
<hr>
<h2>75. Abstraction Example</h2>
<p>Instead of placing low-level Selenium operations inside a test:</p>
<pre><code>driver.findElement(
By.id("username")
).sendKeys("admin");</code></pre>
<p>the test can use:</p>
<pre><code>loginPage.enterUsername("admin");</code></pre>
<hr>
<h2>76. Small Framework vs Enterprise Framework</h2>
<table border="1" cellpadding="8" cellspacing="0">
<tr><th>Small Framework</th><th>Large/Enterprise Framework</th></tr>
<tr><td>Few tests</td><td>Hundreds or thousands of tests</td></tr>
<tr><td>Basic POM</td><td>POM + components</td></tr>
<tr><td>Simple configuration</td><td>Multi-environment configuration</td></tr>
<tr><td>Local execution</td><td>Grid/cloud execution</td></tr>
<tr><td>Basic reporting</td><td>Centralized reporting</td></tr>
<tr><td>Limited utilities</td><td>Reusable utility ecosystem</td></tr>
<tr><td>Manual test execution</td><td>CI/CD execution</td></tr>
<tr><td>Single browser</td><td>Cross-browser execution</td></tr>
</table>
<hr>
<h2>77. E-Commerce Framework Architecture</h2>
<pre><code> E-Commerce Automation
|
+--------------------+--------------------+
| | |
Tests Pages Data
| | |
LoginTest LoginPage Users
ProductTest HomePage Products
CartTest ProductPage Orders
CheckoutTest CartPage
CheckoutPage
|
WebDriver
|
Browser
|
E-Commerce App</code></pre>
<hr>
<h2>78. E-Commerce End-to-End Flow</h2>
<pre><code>Login
↓
Search Product
↓
Open Product
↓
Add To Cart
↓
Open Cart
↓
Checkout
↓
Enter Address
↓
Select Payment
↓
Place Order
↓
Verify Confirmation</code></pre>
<hr>
<h2>79. Complete Enterprise Framework Architecture</h2>
<pre><code> CI/CD Pipeline
|
Git / Maven
|
TestNG
|
+--------+--------+
| |
Test Classes Listeners
| |
↓ ↓
Page Objects Reporting
| |
Page Factory / By Screenshots
| |
+--------+--------+
|
Driver Factory
|
+------------+------------+
| | |
Chrome Firefox Edge
| | |
+------------+------------+
|
Selenium Grid
|
Web Application
Supporting Components:
Configuration
Test Data
Utilities
Logging
Exception Handling
Database
API Utilities
Constants
</code></pre>
<hr>
<h2>80. Complete Framework Execution Flow</h2>
<pre><code>Start Test
↓
Read Configuration
↓
Select Environment
↓
Select Browser
↓
Driver Factory
↓
Create WebDriver
↓
Launch Application
↓
Initialize Page Objects
↓
Execute TestNG Test
↓
Call Page Methods
↓
Selenium WebDriver
↓
Browser
↓
Application
↓
Assertion
↓
PASS / FAIL
↓
Listener
↓
Screenshot if Required
↓
Logging
↓
Reporting
↓
Driver Quit
↓
Final Result</code></pre>
<hr>
<h2>81. Common Framework Mistakes</h2>
<ul>
<li>Putting all automation code in one class.</li>
<li>Duplicating locators.</li>
<li>Duplicating browser setup.</li>
<li>Hard-coding URLs everywhere.</li>
<li>Hard-coding test data in every test.</li>
<li>Using excessive <code>Thread.sleep()</code>.</li>
<li>Using unstable locators.</li>
<li>Making every page field public.</li>
<li>Mixing test logic with page implementation.</li>
<li>Ignoring screenshots after failures.</li>
<li>Not maintaining logs.</li>
<li>Sharing one WebDriver instance across parallel tests.</li>
<li>Creating one huge utility class for unrelated functionality.</li>
<li>Using retry to hide unstable tests.</li>
<li>Creating unnecessary abstraction layers.</li>
</ul>
<hr>
<h2>82. Best Practices</h2>
<ul>
<li>Use Page Object Model for page-specific behavior.</li>
<li>Keep test classes focused on scenarios and assertions.</li>
<li>Centralize browser creation.</li>
<li>Centralize configuration.</li>
<li>Use stable and meaningful locators.</li>
<li>Use condition-based waits.</li>
<li>Keep test data separate from test logic.</li>
<li>Create reusable utility classes.</li>
<li>Capture screenshots for important failures.</li>
<li>Maintain useful execution logs.</li>
<li>Generate readable reports.</li>
<li>Use TestNG groups for test categorization.</li>
<li>Use thread-safe driver management for parallel execution.</li>
<li>Use Selenium Grid when remote or multi-browser execution is required.</li>
<li>Integrate the framework with Git and CI/CD.</li>
<li>Keep dependencies compatible and updated.</li>
<li>Refactor duplicated or obsolete code.</li>
<li>Keep credentials and secrets outside source code.</li>
</ul>
<hr>
<h2>83. Framework Architecture Checklist</h2>
<table border="1" cellpadding="8" cellspacing="0">
<tr><th>Component</th><th>Purpose</th></tr>
<tr><td>WebDriver</td><td>Browser automation.</td></tr>
<tr><td>TestNG</td><td>Test execution and management.</td></tr>
<tr><td>POM</td><td>Page organization and maintainability.</td></tr>
<tr><td>Page Factory</td><td>Traditional element declaration and initialization approach.</td></tr>
<tr><td>BaseTest</td><td>Common test setup and cleanup.</td></tr>
<tr><td>BasePage</td><td>Common page operations.</td></tr>
<tr><td>Driver Factory</td><td>Browser driver creation.</td></tr>
<tr><td>Config Reader</td><td>Configuration management.</td></tr>
<tr><td>Data Utility</td><td>Test-data management.</td></tr>
<tr><td>Wait Utility</td><td>Synchronization.</td></tr>
<tr><td>Screenshot Utility</td><td>Failure evidence.</td></tr>
<tr><td>Listener</td><td>Test lifecycle handling.</td></tr>
<tr><td>Reporting</td><td>Execution results.</td></tr>
<tr><td>Logging</td><td>Execution tracing and debugging.</td></tr>
<tr><td>Selenium Grid</td><td>Remote and multi-browser execution.</td></tr>
<tr><td>CI/CD</td><td>Automated build and test execution.</td></tr>
</table>
<hr>
<h2>84. Framework Architecture Interview Questions</h2>
<h3>Q1. What is a Selenium automation framework?</h3>
<p><strong>Answer:</strong> A Selenium automation framework is an organized collection of design patterns, utilities, test-management tools, coding practices, and supporting components used to create maintainable and scalable Selenium tests.</p>
<h3>Q2. Why do we need framework architecture?</h3>
<p><strong>Answer:</strong> It separates responsibilities, reduces code duplication, improves maintainability, supports reusable components, and makes execution, reporting, debugging, and scaling easier.</p>
<h3>Q3. What is the role of Page Object Model?</h3>
<p><strong>Answer:</strong> POM separates page-specific UI implementation from test scenarios by representing application pages or components as classes.</p>
<h3>Q4. Is Page Factory the complete framework?</h3>
<p><strong>Answer:</strong> No. Page Factory is an approach that can be used within Page Object classes for element declaration and initialization. The complete framework includes many other components.</p>
<h3>Q5. What is Driver Factory?</h3>
<p><strong>Answer:</strong> Driver Factory is responsible for creating WebDriver instances based on browser or execution configuration.</p>
<h3>Q6. What is BaseTest?</h3>
<p><strong>Answer:</strong> BaseTest is a reusable class that commonly contains common test setup and teardown functionality.</p>
<h3>Q7. What is Data-Driven Testing?</h3>
<p><strong>Answer:</strong> Data-Driven Testing separates test input data from test logic so the same test can execute using multiple data sets.</p>
<h3>Q8. What is a Hybrid Framework?</h3>
<p><strong>Answer:</strong> A Hybrid Framework combines multiple techniques such as POM, data-driven testing, keyword-driven concepts, reusable utilities, TestNG, reporting, and CI/CD.</p>
<h3>Q9. How do you handle screenshots?</h3>
<p><strong>Answer:</strong> A Screenshot Utility can capture screenshots, while a TestNG listener can trigger screenshot capture when tests fail.</p>
<h3>Q10. How do you manage multiple browsers?</h3>
<p><strong>Answer:</strong> Use configuration and a Driver Factory to create the required WebDriver instance for Chrome, Firefox, Edge, or another supported execution environment.</p>
<hr>
<h2>85. Advanced Interview Questions</h2>
<h3>Q11. How would you design a scalable Selenium framework?</h3>
<p><strong>Answer:</strong> Separate test, page, driver, configuration, data, utility, listener, reporting, and logging responsibilities. Add thread-safe driver management for parallel execution and integrate the framework with source control and CI/CD.</p>
<h3>Q12. How do you support multiple environments?</h3>
<p><strong>Answer:</strong> Maintain environment-specific configuration and select the required environment through configuration, command-line parameters, or CI/CD variables.</p>
<h3>Q13. How do you make parallel execution safe?</h3>
<p><strong>Answer:</strong> Use independent WebDriver instances per thread and isolate test data so one test does not interfere with another.</p>
<h3>Q14. How do you reduce flaky tests?</h3>
<p><strong>Answer:</strong> Use stable locators, appropriate waits, reliable test data, controlled environment handling, meaningful assertions, and proper cleanup.</p>
<h3>Q15. How do you integrate Selenium with Jenkins?</h3>
<p><strong>Answer:</strong> Store the framework in Git, configure Jenkins to retrieve the project, execute Maven tests, collect reports and screenshots, and publish the results.</p>
<hr>
<h2>86. Practical Project</h2>
<p><strong>Project:</strong> Build a Selenium automation framework for an e-commerce application.</p>
<h3>Project Requirements</h3>
<ul>
<li>Java</li>
<li>Selenium WebDriver</li>
<li>TestNG</li>
<li>Maven</li>
<li>Page Object Model</li>
<li>Page Factory or By-based page objects</li>
<li>DataProvider</li>
<li>Excel/CSV test data</li>
<li>Explicit waits</li>
<li>Screenshot utility</li>
<li>Logging</li>
<li>Reporting</li>
<li>Git</li>
<li>CI/CD</li>
</ul>
<hr>
<h2>87. Practical Project Structure</h2>
<pre><code>AutomationProject
│
├── base
│ ├── BaseTest.java
│ └── BasePage.java
│
├── factory
│ └── DriverFactory.java
│
├── pages
│ ├── LoginPage.java
│ ├── HomePage.java
│ ├── ProductPage.java
│ ├── CartPage.java
│ └── CheckoutPage.java
│
├── tests
│ ├── LoginTest.java
│ ├── ProductTest.java
│ └── CheckoutTest.java
│
├── utilities
│ ├── ConfigReader.java
│ ├── ExcelUtil.java
│ ├── WaitUtil.java
│ └── ScreenshotUtil.java
│
├── listeners
│ └── TestListener.java
│
├── reports
├── screenshots
├── logs
└── testng.xml</code></pre>
<hr>
<h2>88. Practical Project Execution</h2>
<pre><code>Git
↓
Jenkins
↓
Maven
↓
TestNG
↓
BaseTest
↓
DriverFactory
↓
Browser
↓
Page Objects
↓
Selenium WebDriver
↓
Application
↓
Assertions
↓
Listener
↓
Screenshot + Logs
↓
Report</code></pre>
<hr>
<h2>89. Framework Architecture Comparison</h2>
<table border="1" cellpadding="8" cellspacing="0">
<tr><th>Approach</th><th>Structure</th><th>Purpose</th></tr>
<tr><td>Basic Selenium</td><td>Test + WebDriver</td><td>Simple scripts and learning.</td></tr>
<tr><td>POM</td><td>Tests + Page Objects</td><td>Organized page behavior.</td></tr>
<tr><td>POM + Page Factory</td><td>Tests + Page Objects + @FindBy</td><td>Traditional Page Factory implementation.</td></tr>
<tr><td>Data-Driven</td><td>Tests + External Data</td><td>Multiple data combinations.</td></tr>
<tr><td>Keyword-Driven</td><td>Keywords + Execution Engine</td><td>Keyword-based automation.</td></tr>
<tr><td>Hybrid</td><td>POM + Data + Utilities + TestNG + Reports</td><td>Larger automation projects.</td></tr>
</table>
<hr>
<h2>90. Framework Maintenance</h2>
<p>A framework requires continuous maintenance as the application and automation requirements change.</p>
<p>Maintenance activities include:</p>
<ul>
<li>Updating Selenium dependencies.</li>
<li>Updating browser-related configuration.</li>
<li>Updating changed locators.</li>
<li>Removing duplicate code.</li>
<li>Improving synchronization.</li>
<li>Updating test data.</li>
<li>Improving reports.</li>
<li>Updating CI/CD configuration.</li>
<li>Removing obsolete utilities.</li>
<li>Refactoring unstable tests.</li>
</ul>
<hr>
<h2>91. Framework Code Review Checklist</h2>
<ul>
<li>Are locators stable?</li>
<li>Is the test readable?</li>
<li>Is code duplicated?</li>
<li>Are waits appropriate?</li>
<li>Is test data isolated?</li>
<li>Are exceptions handled properly?</li>
<li>Are logs meaningful?</li>
<li>Are failure screenshots available?</li>
<li>Are sensitive credentials protected?</li>
<li>Is the package structure consistent?</li>
<li>Are unnecessary dependencies avoided?</li>
</ul>
<hr>
<h2>92. Framework Security</h2>
<p>Automation frameworks may use usernames, passwords, tokens, API keys, or environment-specific information. Sensitive values should not be hard-coded into source code or committed to public repositories.</p>
<p>Prefer:</p>
<ul>
<li>Environment variables</li>
<li>CI/CD secret management</li>
<li>Secure configuration</li>
<li>Masked credentials</li>
<li>Dedicated test accounts</li>
</ul>
<hr>
<h2>93. Quick Revision Table</h2>
<table border="1" cellpadding="8" cellspacing="0">
<tr><th>Concept</th><th>Meaning</th></tr>
<tr><td>Framework</td><td>Structured automation system.</td></tr>
<tr><td>Architecture</td><td>Organization of framework components.</td></tr>
<tr><td>POM</td><td>Design pattern for page organization.</td></tr>
<tr><td>Page Factory</td><td>Traditional page-element initialization approach.</td></tr>
<tr><td>BaseTest</td><td>Common test lifecycle.</td></tr>
<tr><td>BasePage</td><td>Common page functionality.</td></tr>
<tr><td>Driver Factory</td><td>WebDriver creation.</td></tr>
<tr><td>Config Reader</td><td>Configuration management.</td></tr>
<tr><td>Data Utility</td><td>Test-data management.</td></tr>
<tr><td>Wait Utility</td><td>Synchronization.</td></tr>
<tr><td>Listener</td><td>Test lifecycle event handling.</td></tr>
<tr><td>Reporting</td><td>Test execution results.</td></tr>
<tr><td>Logging</td><td>Execution tracing and debugging.</td></tr>
<tr><td>Grid</td><td>Remote/multi-browser execution.</td></tr>
<tr><td>CI/CD</td><td>Automated build and test execution.</td></tr>
</table>
<hr>
<h2>94. Most Important Architecture Flow</h2>
<pre><code>Configuration
↓
Driver Factory
↓
WebDriver
↓
BaseTest
↓
TestNG
↓
Test Class
↓
Page Object
↓
Page Factory / By Locators
↓
WebDriver Actions
↓
Browser
↓
Application
↓
Assertions
↓
Listener
↓
Screenshot
↓
Logging
↓
Reporting
↓
CI/CD</code></pre>
<hr>
<h2>95. Final Summary</h2>
<p>Selenium Framework Architecture provides a structured way to organize automation testing projects. Instead of writing browser commands directly inside every test case, the framework separates responsibilities into test classes, page objects, driver management, configuration, test data, utilities, synchronization, listeners, reporting, logging, parallel execution, Selenium Grid, and CI/CD.</p>
<p>Page Object Model provides a strong foundation for organizing page-specific behavior, while Page Factory can be used as one traditional approach for declaring and initializing page elements. TestNG manages test execution, DataProvider supports data-driven execution, Driver Factory manages browser creation, utilities provide reusable functionality, listeners handle execution events, reporting records results, and CI/CD automates test execution.</p>
<p>A good framework architecture should be readable, maintainable, reusable, scalable, reliable, and easy for a team of automation engineers to extend.</p>
<hr>
<h2>96. One-Line Revision</h2>
<p><strong>Selenium Framework Architecture is the organized structure that connects tests, page objects, WebDriver, browser management, configuration, test data, utilities, synchronization, reporting, logging, Grid, and CI/CD into a maintainable automation system.</strong></p>
<hr>
<h2>97. Course Resources</h2>
<p>Learn Selenium automation, TestNG, Page Object Model, automation framework development, data-driven testing, reporting, Grid, and CI/CD through <a href="https://www.justacademy.co/course-detail/selenium-training" target="_blank" rel="noopener noreferrer">Selenium Training</a>.</p>
<p>For course enquiry and demo registration, visit <a href="https://www.justacademy.co/register-for-course-demo" target="_blank" rel="noopener noreferrer">Register for Course Demo</a>.</p>
<hr>
<h2>98. Complete Selenium Framework Learning Roadmap</h2>
<pre><code>Software Testing
↓
Core Java
↓
Selenium WebDriver
↓
Locators
↓
WebElements
↓
Waits & Synchronization
↓
TestNG
↓
Page Object Model
↓
Page Factory
↓
Data-Driven Testing
↓
Keyword-Driven Framework
↓
Hybrid Framework
↓
Framework Architecture
↓
Maven
↓
Reporting
↓
Logging
↓
Screenshots
↓
Selenium Grid
↓
Cross-Browser Testing
↓
Git & GitHub
↓
Jenkins
↓
CI/CD
↓
Real-Time Automation Project</code></pre>
</div>